package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import pojo.User;
import vo.UserVO;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * 获取请求数据
 */
@Controller
public class GetRequestData {
    /**
     * 获得基本类型参数
     * 业务方法的参数名称要与请求参数的name一致,
     * 参数值会自动映射匹配,
     * 且能自动做类型转换。
     */
    @ResponseBody
    @RequestMapping("/request01")
    public void request01(String username,int age) {
        //URL=http://localhost:8080/SpringMVC_RR/request01?username=AnonyEast&age=20
        System.out.println("username = " + username);//AnonyEast
        System.out.println("age = " + age);//20
    }

    /**
     * 获得POJO类型参数
     * 业务方法的POJO参数的属性名要与请求参数的name一致，
     * 参数值会自动映射匹配。
     */
    @ResponseBody
    @RequestMapping("/request02")
    public void request02(User user) {
        //URL=http://localhost:8080/SpringMVC_RR/request02?username=AnonyEast&age=20&addr=ChengDu
        //User{name='null', age=20, addr='ChengDu'}
        //因为请求参数中没有name属性，所以name不会被赋值
        System.out.println(user);
    }

    /**
     * 获得数组类型参数(用的很少)
     * 业务方法数组名称与请求参数的name一致，参数值会自动映射匹配。
     */
    @ResponseBody
    @RequestMapping("/request03")
    public void request03(String[] strs) {
        //URL=http://localhost:8080/SpringMVC_RR/request03?strs=111&strs=222&strs=333
        List<String> strings = Arrays.asList(strs);//将数组转换为List集合
        System.out.println(strings);//[111, 222, 333]
    }

    /**
     * 获得集合类型参数
     * 获得集合参数时，要将集合参数包装到一个VO中才可以。
     * VO：Value Object，值对象。主要用在前端数据和控件的绑定操作中，以键值对的形式存在。
     */
    @ResponseBody
    @RequestMapping("/request04")
    public void request04(UserVO userVO) {
        //通过表单方式获取
        //UserVO{userList=[User{name='zhangsan', age=23, addr='null'}, User{name='lisi', age=24, addr='null'}]}
        System.out.println(userVO);
    }

    /**
     * 获得集合类型参数
     * 当使用ajax提交时，可以指定contentType为json形式，
     * 那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用VO进行包装
     */
    @ResponseBody
    @RequestMapping("/request05")
    public void request05(@RequestBody List<User> userList) {
        //通过表单方式获取
        //[User{name='wangwu', age=25, addr='null'}, User{name='zhaoliu', age=26, addr='null'}]
        System.out.println(userList);
    }

    /**
     * 参数绑定注解@RequestParam
     * 当请求的参数名称方法的参数名称不一致时，
     * 就需要通过@RequestParam注解显示的进行绑定。
     *
     * 注解@RequestParam还有如下参数可以使用：
     * value：与请求参数名称
     * required：此在指定的请求参数是否必须包括，默认是true，提交时如果没有此参数则报错
     * defaultValue：当没有指定请求参数时，则使用指定的默认值赋值
     */
    @ResponseBody
    @RequestMapping("/request06")
    public void request06(@RequestParam(value = "name",required = false,defaultValue = "未输入用户名") String username) {
        System.out.println("username = " + username);
    }

    /**
     * Restful风格的参数的获取
     * 在方法中使用@PathVariable注解进行占位符的匹配获取工作。
     */
    @ResponseBody
    @RequestMapping("/request07/{user}")
    public void request07(@PathVariable("user") String username) {
        System.out.println("username = " + username);
    }

    /**
     * 自定义类型转换器,转换器在converter包下
     *
     * SpringMVC默认已经提供了一些常用的类型转换器，
     * 例如客户端提交的字符串转换成int型进行参数设置。
     * 但是不是所有的数据类型都提供了转换器，
     * 没有提供的就需要自定义转换器，
     * 例如：日期类型的数据就需要自定义转换器。
     */
    @ResponseBody
    @RequestMapping("/request08")
    public void request08(Date date) {
        //URL:http://localhost:8080/SpringMVC_RR/request08?date=2020-7-25
        System.out.println(date);
    }

    /**
     * 获得请求头信息
     * 1.使用@RequestHeader可以获得请求头信息，相当于web阶段学习的request.getHeader(name)
     *
     * @RequestHeader注解的属性如下：
     * value：请求头的名称
     * required：是否必须携带此请求头
     *
     * 2.使用@CookieValue可以获得指定Cookie的值
     *
     * @CookieValue注解的属性如下：
     * value：指定cookie的名称(cookie是键值对形式，通过键找值)
     * required：是否必须携带此cookie
     */
    @ResponseBody
    @RequestMapping("/request09")
    public void request09(@RequestHeader("User-Agent") String userAgent,@CookieValue("JSESSIONID") String cookie){
        //输出请求头中的User-Agent和Cookie
        System.out.println("User-Agent = " + userAgent);
        System.out.println("cookie = " + cookie);
    }
}
